On Error, instructie

       

Schakelt een foutafhandelingsroutine in en geeft de locatie van de routine binnen een procedure aan. U kunt hiermee ook een foutafhandelingsroutine uitschakelen.

Syntaxis

On Error GoTo regel

On Error Resume Next

On Error GoTo 0

De instructie On Error kan een van de volgende vormen hebben:

Instructie Beschrijving
On Error GoTo regel Schakelt de foutafhandelingsroutine in die begint bij regel en is opgegeven bij het vereiste argument regel. Dit kan een willekeurige regellabel of willekeurig regelnummer zijn. Als daarna een runtimefout optreedt, gaat de besturing naar regel, waardoor de foutafhandelingsroutine geactiveerd wordt. De opgegeven regel moet in dezelfde procedure staan als de instructie On Error, anders treedt een compiletime-fout op.
On Error Resume Next Bepaalt dat wanneer een runtimefout optreedt, de besturing wordt overgedragen aan de instructie, direct na de instructie waar de fout is opgetreden. De uitvoering wordt hierdoor voortgezet. Gebruik bij voorkeur deze vorm in plaats van On Error GoTo bij de toegang tot objecten.
On Error GoTo 0 Schakelt alle ingeschakelde foutafhandelingsroutines in de huidige procedure uit.

Notities

Als u geen instructie On Error gebruikt, is elke runtimefout die optreedt, fataal. Er verschijnt een foutbericht en de uitvoering wordt afgebroken.

Een "ingeschakelde" foutafhandelingsroutine is een routine die is ingeschakeld met een instructie On Error. Een "actieve" foutafhandelingsroutine is een ingeschakelde routine die bezig is een fout af te handelen. Als een fout optreedt terwijl een foutafhandelingsroutine actief is (tussen het optreden van de fout en een instructie Resume, Exit Sub, Exit Function of Exit Property), kan de fout niet worden afgehandeld door de foutafhandelingsroutine van de actieve procedure. De besturing keert dan terug naar de oproepprocedure. Als in de oproepprocedure een ingeschakelde foutafhandelingsroutine staat, wordt deze geactiveerd om de fout af te handelen. Als de foutafhandelingsroutine in de oproepprocedure ook actief is, gaat de besturing terug door vorige oproepprocedures totdat een ingeschakelde maar inactieve foutafhandelingsroutine wordt aangetroffen. Als geen inactieve, ingeschakelde foutafhandelingsroutine wordt gevonden, is de fout fataal op het punt waar deze feitelijk is opgetreden. Elke keer als de foutafhandelingsroutine de besturing overdraagt aan de oproepprocedure, wordt die procedure de actieve procedure. Nadat een fout is afgehandeld door een foutafhandelingsroutine in een willekeurige procedure, wordt de uitvoering hervat in de actieve procedure op het punt dat is opgegeven in de instructie Resume.

Opmerking   Een foutafhandelingsroutine is geen procedure Sub of Function. Het is een sectie van de code die is gemarkeerd door een regellabel of regelnummer.

Foutafhandelingsroutines gebruiken de waarde in de eigenschap Number van het object Err om de oorzaak van de fout vast te stellen. De foutafhandelingsroutine moet relevante waarden van eigenschappen van het object Err testen of opslaan voordat een andere fout kan optreden of voordat een procedure die een fout zou kunnen veroorzaken, wordt opgeroepen. De waarden van de eigenschappen van het object Err hebben alleen betrekking op de meest recente fout. Het bijbehorende foutbericht bij Err.Number staat in Err.Description.

On Error Resume Next zorgt dat de uitvoering wordt voortgezet met de instructie direct na de instructie die de runtimefout heeft veroorzaakt, of met de instructie direct na de meest recente oproep uit de procedure waarin de instructie On Error Resume Next staat. Op die manier kan de uitvoering ondanks een runtimefout toch worden voortgezet. U kunt de foutafhandelingsroutine dan in line binnen de procedure maken, in plaats van de besturing over te dragen aan een andere locatie binnen de procedure. Een instructie On Error Resume Next wordt inactief wanneer een andere procedure wordt opgeroepen. Voer daarom in elke opgeroepen routine een instructie On Error Resume Next uit als u in line foutafhandeling binnen die routine wilt.

Opmerking   Gebruik bij voorkeur de constructie On Error Resume Next in plaats van On Error GoTo voor fouten die worden gegenereerd tijdens de toegang tot andere objecten. Door Err na elke interactie met een object te controleren voorkomt u onduidelijkheid over het object waartoe de code toegang zocht toen de fout optrad. U weet dan zeker door welk object de foutcode in Err.Number is geplaatst en door welk object de fout oorspronkelijk is gegenereerd (het object dat is opgegeven in Err.Source).

On Error GoTo 0 schakelt foutafhandeling in de actieve procedure uit. Hiermee wordt dus niet regel 0 ingesteld als het begin van de foutafhandelingscode, ook niet als de procedure een regel met nummer 0 bevat. Zonder een instructie On Error GoTo 0 wordt een foutafhandelingsroutine automatisch uitgeschakeld zodra een procedure wordt afgesloten.

Als u wilt voorkomen dat foutafhandelingscode wordt uitgevoerd terwijl er geen fout is opgetreden, plaatst u een instructie Exit Sub, Exit Function of Exit Property direct voor de foutafhandelingsroutine, zoals in het volgende voorbeeld:

Sub MatrixInitialiseren(Var1, Var2, Var3, Var4)
    On Error GoTo FoutAfhandeling
    . . .
    Exit Sub
FoutAfhandeling:
    . . .
    Resume Next
End Sub

In dit voorbeeld komt de foutafhandelingscode na de instructie Exit Sub en voor de instructie End Sub, waardoor deze van het normale procedureverloop wordt gescheiden. Dit is slechts ΘΘn mogelijke oplossing. Foutafhandelingscode kan overal in een procedure worden geplaatst.

Niet-onderschepte fouten in objecten worden aan de besturende toepassingen doorgegeven als het object wordt uitgevoerd als een uitvoerbaar bestand. Binnen de ontwikkelomgeving worden deze alleen aan de besturende toepassing doorgegeven als de betreffende opties hiervan zijn ingesteld. Raadpleeg de documentatie bij uw brontoepassing voor informatie over de opties die moeten worden ingesteld tijdens het opsporen van fouten, hoe deze moeten worden ingesteld en of de brontoepassing klassen kan maken.

Als u een object maakt en dat object verkrijgt toegang tot andere objecten, moet u proberen fouten die door deze objecten onafgehandeld worden doorgegeven, alsnog af te handelen. Als u dergelijke fouten niet kunt afhandelen, dient uw object ze terug te geven aan de oproeper van uw object nadat het eerst de foutcode in Err.Number heeft toegewezen aan een van uw eigen fouten. Geef uw fout op door uw foutcode op te tellen bij de constante vbObjectError. Als uw foutcode bijvoorbeeld 1052 is, wijst u deze als volgt toe:

Err.Number = vbObjectError + 1052

Opmerking   Systeemfouten signaleren tijdens het oproepen van Windows-DLL's (dynamic-link libraries) of Macintosh-programacodebronnen geen uitzonderingssituaties. Ze kunnen dan ook niet worden onderschept met Visual Basic-foutonderschepping. Bij het oproepen van DLL-functies dient u aan de hand van elke resultaatwaarde te controleren of deze geslaagd of mislukt is (volgens de API-specificaties). Bij mislukking controleert u de waarde in de eigenschap LastDLLError van het object ErrLastDLLError geeft altijd nul als resultaat op de Macintosh.